package com.atguigu.core.listener;

import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.time.Duration;

/**
 * @author DongZH
 * @content SpringBoot应用生命周期监听
 * @since 2024/4/5 - 21:17
 **/

/**
 * Listener先要从 META-INF/spring.factories 读到
 * 1、引导：
 *      starting：应用开始，SpringApplication的run方法一调用，只要有了 BootstrapContext 就执行
 *      environmentPrepared：环境准备好（把启动参数等绑定到环境变量中），但是ioc还没有创建；【调一次】
 * 2、启动：
 *      contextPrepared：ioc容器创建并准备好，但是sources（主配置类）没加载；组件都没创建，并关闭引导上下文 【调一次】
 *      contextLoaded：ioc容器加载。主配置类加载进去了。但是ioc容器还没刷新（我们的bean还没创建）
 *      ==========截止以前，ioc容器里面还没早bean呢==========
 *      started：ioc容器刷新了（所有bean造好了），但是runner没调用。
 *      ready：ioc容器刷新了（所有bean造好了），所有runner调用完了。
 * 3、运行：
 *      以前步骤都正确执行，代表容器running。
 */
public class MyAppListener implements SpringApplicationRunListener {
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("==========starting==========正在启动==========");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("==========environmentPrepared==========环境准备完成==========");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("==========contextPrepared==========ioc容器准备完成==========");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("==========contextLoaded==========ioc容器加载完成==========+");
    }

    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("==========started==========启动完成==========");
    }

    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("==========ready==========准备就绪==========");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("==========failed==========应用启动失败==========");
    }
}
